package com.ruoyi.project.system.service.impl;

import com.ruoyi.project.system.domain.ReservationStatsDTO;
import com.ruoyi.project.system.mapper.TempDailyScheduleMapper;
import com.ruoyi.project.system.service.IReservationStatsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 预约统计服务实现（纯数据库驱动：二级科室→一级科室，无默认科室）
 */
@Service
public class ReservationStatsServiceImpl implements IReservationStatsService {
    private static final Logger log = LoggerFactory.getLogger(ReservationStatsServiceImpl.class);

    @Autowired
    private TempDailyScheduleMapper tempDailyScheduleMapper;

    @Override
    public ReservationStatsDTO getReservationStats() {
        ReservationStatsDTO result = new ReservationStatsDTO();

        try {
            // 1. 查询总剩余名额（兼容 Long/Integer 类型，避免转换错误）
            Object totalObj = tempDailyScheduleMapper.selectTempScheduleTotalRemaining();
            Integer totalRemaining = 0;
            if (totalObj != null && totalObj instanceof Number) {
                totalRemaining = ((Number) totalObj).intValue();
            }
            result.setTotal_remaining(totalRemaining);

            // 2. 从 temp_schedule 表查询所有存在的二级科室（按二级科室分组，获取剩余名额）
            List<Map<String, Object>> secondDeptList = tempDailyScheduleMapper.selectSecondDeptRemaining();
            log.info("temp_schedule表实际存在的二级科室数量：{}", secondDeptList.size());

            // 3. 核心逻辑：二级科室 → 一级科室 → 按一级科室分组汇总
            Map<String, Integer> topDeptTotalMap = new HashMap<>();
            for (Map<String, Object> secondDept : secondDeptList) {
                // 3.1 获取二级科室名（容错：避免空值）
                String secondDeptName = Optional.ofNullable((String) secondDept.get("second_dept_name"))
                        .orElse("未知二级科室");

                // 3.2 获取该二级科室的剩余名额（强制兼容 Long/Integer，彻底解决类型转换）
                Number secondRemainingNum = (Number) Optional.ofNullable(secondDept.get("second_remaining"))
                        .orElse(0);
                Integer secondRemaining = secondRemainingNum.intValue();

                // 3.3 根据二级科室名，查询对应的一级科室名（从 department_list 表关联）
                String topDeptName = tempDailyScheduleMapper.selectTopDeptBySecondDept(secondDeptName);
                // 容错：未匹配到一级科室时，归类为“其他科室”
                if (topDeptName == null || topDeptName.trim().isEmpty()) {
                    topDeptName = "其他科室";
                }

                // 3.4 按一级科室累加剩余名额（相同一级科室自动汇总）
                topDeptTotalMap.put(
                    topDeptName,
                    topDeptTotalMap.getOrDefault(topDeptName, 0) + secondRemaining
                );
                log.debug("二级科室[{}] → 一级科室[{}]，剩余名额[{}]", secondDeptName, topDeptName, secondRemaining);
            }

            // 4. 构建最终统计列表（仅包含实际存在的一级科室，无默认项）
            List<ReservationStatsDTO.DeptStats> statsList = new ArrayList<>();
            for (Map.Entry<String, Integer> entry : topDeptTotalMap.entrySet()) {
                ReservationStatsDTO.DeptStats deptStats = new ReservationStatsDTO.DeptStats();
                deptStats.setDepartment(entry.getKey()); // 一级科室名（纯数据库查询所得）
                deptStats.setRemaining(entry.getValue()); // 该一级科室总剩余名额
                statsList.add(deptStats);
            }

            // 可选：按科室名字典序排序（让结果更规整，按需删除）
            statsList.sort(Comparator.comparing(ReservationStatsDTO.DeptStats::getDepartment));

            log.info("temp_schedule表实际存在的一级科室数量：{}", statsList.size());
            result.setStats(statsList);

        } catch (Exception e) {
            log.error("获取预约统计数据失败", e);
            // 异常降级：返回空列表（无默认科室），总名额0
            result.setTotal_remaining(0);
            result.setStats(new ArrayList<>());
        }

        return result;
    }

    /**
     * 移除原默认科室构建方法（无需默认值）
     */
}